package main

import (
	"context"
	"example_shorten/kitex_gen/example/shorten/url"
	"example_shorten/kitex_gen/example/shorten/url/urlservice"
	"log"
	"net/http"
	"strings"
	"time"

	"github.com/cloudwego/hertz/pkg/app"
	"github.com/cloudwego/hertz/pkg/app/server"
	"github.com/cloudwego/kitex/client"
	"github.com/cloudwego/kitex/client/callopt"
)

// 全局变量声明
var (
	cli urlservice.Client
	// host 定义了服务器监听的地址和端口
	host = "localhost:8080"
)

// main 函数是程序的入口点
func main() {
	// 创建 Kitex 客户端，用于调用短链接生成服务
	c, err := urlservice.NewClient("example.shorten.url", client.WithHostPorts("0.0.0.0:8888"))
	if err != nil {
		log.Fatal(err)
	}

	// 初始化全局客户端变量
	cli = c

	// 创建 Hertz 服务器实例
	hz := server.New(server.WithHostPorts(host))

	// 注册处理短链接生成的路由
	hz.POST("/api/shorten", shortenHandler)
	// 注册处理短链接重定向的路由
	hz.GET("/*path", redirectHandler)

	// 启动服务器，监听指定端口
	if err := hz.Run(); err != nil {
		log.Fatal(err)
	}

}

// shortenHandler 处理短链接生成请求
func shortenHandler(ctx context.Context, c *app.RequestContext) {
	// 创建请求对象，包含需要缩短的长链接
	url_param, bool := c.GetQuery("url")
	if !bool {
		c.String(400, "Bad Request", http.StatusBadRequest)
		return
	}
	req := &url.GenerateUrlReq{Url: url_param}
	// 调用 Kitex 客户端方法生成短链接
	resp, err := cli.GenerateUrl(context.Background(), req, callopt.WithConnectTimeout(3*time.Second))
	if err != nil {
		log.Fatal(err)
	}
	// 打印响应结果
	log.Println(resp)
	// 设置响应中的短链接，拼接服务器地址
	resp.SetShortUrl(host + "/" + resp.ShortUrl)
	// 返回生成的短链接
	c.JSON(200, resp)

}

// redirectHandler 处理短链接重定向请求
func redirectHandler(ctx context.Context, c *app.RequestContext) {
	// 获取请求的路径
	path := string(c.Path())
	// 如果路径为空，返回 404 Not Found 错误
	if path == "/" {
		c.String(404, "Not found", http.StatusNotFound)
		return
	}

	// 去除路径的前导斜杠，得到短链接
	shortURL := strings.TrimPrefix(path, "/")
	var longURL string

	// 创建请求对象，包含需要缩短的长链接
	req := &url.GetUrlReq{Url: shortURL}
	// 调用 Kitex 客户端方法生成短链接
	resp, err := cli.GetUrl(context.Background(), req, callopt.WithConnectTimeout(3*time.Second))
	log.Printf("resp: %s, ok: %v", resp, err)
	if err != nil {
		log.Fatal(err)
		c.JSON(400, err)
		return
	}
	longURL = resp.Url.GetLongUrl()

	// 将客户端重定向到原始长链接
	c.Redirect(http.StatusMovedPermanently, []byte(longURL))
}
